module Shiftm(
    input  wire  clk,rst_n,
    input  wire  [63:0]EncDin, //encode 并行输入
    input  wire  [95:0]DecDin, //decode 串行输入
    input  wire  Shift,Load,   //移位和并行加载控制 
    output wire  [95:0]EncDout,//encode   0：0 1：1665
    output wire  [63:0]DecDout 
);
parameter Dec_min_bound  = 832;
parameter Dec_max_bound  = 2497;
parameter Bit_1_out = 1665;

reg [7:0] DecData;
genvar i;
generate
    for(i=0;i<8;i=i+1) begin
        always@(*) begin
            if(DecDin[12*i+11:12*i]<Dec_max_bound && DecDin[12*i+11:12*i]>Dec_min_bound)  DecData[i]=1'b1;
            else DecData[i]=1'b0;
        end
    end
    endgenerate

reg [63:0] m;
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n) m <= 64'd0;
    else if(Load)  m <= EncDin;
    else if(Shift) m <= {DecData , m[63:8]};
end


generate
    for(i=0;i<8;i=i+1)
    begin
        assign EncDout[12*i+11:12*i] = m[i] ? Bit_1_out : 12'b0;
    end
    endgenerate

assign DecDout = m;
endmodule


// module Shiftm_tb;
// reg  clk,rst_n;
// reg  [64:0]EncDin;//encode 并行输入
// reg  [95:0]DecDin;//decode 串行输入
// reg  Shift,Load;//移位和并行加载控制 
// wire [94:0]EncDout;//encode   0：0 1：1665
// wire [63:0]DecDout;
// reg  [ 1:0]Enc_cnt;


// Shiftm theshiftm(.clk(clk),.rst_n(rst_n),.EncDin(EncDin),.DecDin(DecDin),.Shift(Shift),.Load(Load),.EncDout(EncDout),.DecDout(DecDout));
// initial begin
//     clk=0;
//     rst_n=0;
//     Enc_cnt=0;
//     DecDin=0;
//     #20 rst_n=1;
//     #20 rst_n=0;
// end
// always #5 clk=~clk;
// wire [11:0] Dec_data[0:7];
// wire [11:0] Enc_data[0:7];

// always@(posedge clk or negedge rst_n) begin
//     EncDin<= $random;
//     Enc_cnt<=Enc_cnt+1;
//     if(Enc_cnt == 0) begin Load<=1; Shift<=0; end
//     else begin Load<=0; Shift<=1; end
// end
// genvar i;

// for(i=0;i<8;i=i+1)
// begin
//     assign Enc_data[i] = EncDout[12*i + 11 : 12*i];
// end

// for(i=0;i<8;i=i+1)
// begin
//     assign Dec_data[i] = DecDin[12*i + 11 : 12*i];
// end


// endmodule